pilothub 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -0
- package/README.md +36 -129
- package/dist/browserAuth.d.ts +20 -0
- package/dist/browserAuth.js +156 -0
- package/dist/browserAuth.js.map +1 -0
- package/dist/browserAuth.test.d.ts +1 -0
- package/dist/browserAuth.test.js +83 -0
- package/dist/browserAuth.test.js.map +1 -0
- package/dist/cli/buildInfo.d.ts +3 -0
- package/dist/cli/buildInfo.js +103 -0
- package/dist/cli/buildInfo.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +9 -0
- package/dist/cli/commands/auth.js +75 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +11 -0
- package/dist/cli/commands/delete.js +67 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/delete.test.d.ts +1 -0
- package/dist/cli/commands/delete.test.js +52 -0
- package/dist/cli/commands/delete.test.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +9 -0
- package/dist/cli/commands/publish.js +87 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/publish.test.d.ts +1 -0
- package/dist/cli/commands/publish.test.js +104 -0
- package/dist/cli/commands/publish.test.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +23 -0
- package/dist/cli/commands/skills.js +298 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/skills.test.d.ts +1 -0
- package/dist/cli/commands/skills.test.js +156 -0
- package/dist/cli/commands/skills.test.js.map +1 -0
- package/dist/cli/commands/star.d.ts +8 -0
- package/dist/cli/commands/star.js +38 -0
- package/dist/cli/commands/star.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +3 -0
- package/dist/cli/commands/sync.js +160 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/sync.test.d.ts +1 -0
- package/dist/cli/commands/sync.test.js +277 -0
- package/dist/cli/commands/sync.test.js.map +1 -0
- package/dist/cli/commands/syncHelpers.d.ts +76 -0
- package/dist/cli/commands/syncHelpers.js +349 -0
- package/dist/cli/commands/syncHelpers.js.map +1 -0
- package/dist/cli/commands/syncHelpers.test.d.ts +1 -0
- package/dist/cli/commands/syncHelpers.test.js +22 -0
- package/dist/cli/commands/syncHelpers.test.js.map +1 -0
- package/dist/cli/commands/syncTypes.d.ts +24 -0
- package/dist/cli/commands/syncTypes.js +2 -0
- package/dist/cli/commands/syncTypes.js.map +1 -0
- package/dist/cli/commands/unstar.d.ts +8 -0
- package/dist/cli/commands/unstar.js +38 -0
- package/dist/cli/commands/unstar.js.map +1 -0
- package/dist/cli/helpStyle.d.ts +13 -0
- package/dist/cli/helpStyle.js +38 -0
- package/dist/cli/helpStyle.js.map +1 -0
- package/dist/cli/pilotbotConfig.d.ts +6 -0
- package/dist/cli/pilotbotConfig.js +110 -0
- package/dist/cli/pilotbotConfig.js.map +1 -0
- package/dist/cli/pilotbotConfig.test.d.ts +1 -0
- package/dist/cli/pilotbotConfig.test.js +133 -0
- package/dist/cli/pilotbotConfig.test.js.map +1 -0
- package/dist/cli/registry.d.ts +7 -0
- package/dist/cli/registry.js +42 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/registry.test.d.ts +1 -0
- package/dist/cli/registry.test.js +48 -0
- package/dist/cli/registry.test.js.map +1 -0
- package/dist/cli/scanSkills.d.ts +7 -0
- package/dist/cli/scanSkills.js +75 -0
- package/dist/cli/scanSkills.js.map +1 -0
- package/dist/cli/scanSkills.test.d.ts +1 -0
- package/dist/cli/scanSkills.test.js +60 -0
- package/dist/cli/scanSkills.test.js.map +1 -0
- package/dist/cli/slug.d.ts +2 -0
- package/dist/cli/slug.js +16 -0
- package/dist/cli/slug.js.map +1 -0
- package/dist/cli/types.d.ts +15 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/ui.d.ts +7 -0
- package/dist/cli/ui.js +72 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +268 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +38 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +5 -0
- package/dist/discovery.js +21 -0
- package/dist/discovery.js.map +1 -0
- package/dist/discovery.test.d.ts +1 -0
- package/dist/discovery.test.js +46 -0
- package/dist/discovery.test.js.map +1 -0
- package/dist/http.d.ts +32 -0
- package/dist/http.js +261 -0
- package/dist/http.js.map +1 -0
- package/dist/http.test.d.ts +1 -0
- package/dist/http.test.js +135 -0
- package/dist/http.test.js.map +1 -0
- package/dist/schema/ark.js.map +1 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/routes.js.map +1 -0
- package/{packages/schema/dist → dist/schema}/schemas.d.ts +0 -39
- package/{packages/schema/dist → dist/schema}/schemas.js +0 -22
- package/dist/schema/schemas.js.map +1 -0
- package/dist/schema/textFiles.js.map +1 -0
- package/dist/schema/textFiles.test.d.ts +1 -0
- package/dist/schema/textFiles.test.js +20 -0
- package/dist/schema/textFiles.test.js.map +1 -0
- package/dist/skills.d.ts +43 -0
- package/dist/skills.js +163 -0
- package/dist/skills.js.map +1 -0
- package/dist/skills.test.d.ts +1 -0
- package/dist/skills.test.js +144 -0
- package/dist/skills.test.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +27 -70
- package/.env.local.example +0 -19
- package/.github/workflows/ci.yml +0 -40
- package/.oxlintrc.json +0 -3
- package/AGENTS.md +0 -45
- package/CHANGELOG.md +0 -138
- package/DEPRECATIONS.md +0 -7
- package/biome.json +0 -41
- package/convex/_generated/api.d.ts +0 -153
- package/convex/_generated/api.js +0 -23
- package/convex/_generated/dataModel.d.ts +0 -60
- package/convex/_generated/server.d.ts +0 -143
- package/convex/_generated/server.js +0 -93
- package/convex/auth.config.ts +0 -8
- package/convex/auth.ts +0 -19
- package/convex/comments.ts +0 -88
- package/convex/crons.ts +0 -34
- package/convex/devSeed.ts +0 -459
- package/convex/devSeedExtra.ts +0 -541
- package/convex/downloads.ts +0 -78
- package/convex/githubBackups.ts +0 -170
- package/convex/githubBackupsNode.ts +0 -183
- package/convex/githubImport.ts +0 -317
- package/convex/githubSoulBackups.ts +0 -170
- package/convex/githubSoulBackupsNode.ts +0 -186
- package/convex/http.ts +0 -194
- package/convex/httpApi.handlers.test.ts +0 -488
- package/convex/httpApi.test.ts +0 -70
- package/convex/httpApi.ts +0 -305
- package/convex/httpApiV1.handlers.test.ts +0 -584
- package/convex/httpApiV1.ts +0 -1172
- package/convex/leaderboards.ts +0 -39
- package/convex/lib/access.ts +0 -36
- package/convex/lib/apiTokenAuth.ts +0 -36
- package/convex/lib/badges.ts +0 -50
- package/convex/lib/changelog.test.ts +0 -34
- package/convex/lib/changelog.ts +0 -278
- package/convex/lib/embeddings.ts +0 -38
- package/convex/lib/githubBackup.ts +0 -443
- package/convex/lib/githubImport.test.ts +0 -247
- package/convex/lib/githubImport.ts +0 -425
- package/convex/lib/githubSoulBackup.ts +0 -443
- package/convex/lib/leaderboards.ts +0 -103
- package/convex/lib/moderation.ts +0 -42
- package/convex/lib/public.ts +0 -89
- package/convex/lib/searchText.test.ts +0 -46
- package/convex/lib/searchText.ts +0 -27
- package/convex/lib/skillBackfill.test.ts +0 -34
- package/convex/lib/skillBackfill.ts +0 -67
- package/convex/lib/skillPublish.test.ts +0 -28
- package/convex/lib/skillPublish.ts +0 -284
- package/convex/lib/skillStats.ts +0 -80
- package/convex/lib/skills.test.ts +0 -197
- package/convex/lib/skills.ts +0 -273
- package/convex/lib/soulChangelog.ts +0 -273
- package/convex/lib/soulPublish.ts +0 -236
- package/convex/lib/tokens.test.ts +0 -33
- package/convex/lib/tokens.ts +0 -51
- package/convex/lib/webhooks.test.ts +0 -91
- package/convex/lib/webhooks.ts +0 -112
- package/convex/maintenance.test.ts +0 -270
- package/convex/maintenance.ts +0 -840
- package/convex/rateLimits.ts +0 -50
- package/convex/schema.ts +0 -472
- package/convex/search.test.ts +0 -12
- package/convex/search.ts +0 -254
- package/convex/seed.test.ts +0 -37
- package/convex/seed.ts +0 -254
- package/convex/seedSouls.ts +0 -111
- package/convex/skillStatEvents.ts +0 -568
- package/convex/skills.ts +0 -1606
- package/convex/soulComments.ts +0 -88
- package/convex/soulDownloads.ts +0 -14
- package/convex/soulStars.ts +0 -71
- package/convex/souls.ts +0 -570
- package/convex/stars.ts +0 -108
- package/convex/statsMaintenance.ts +0 -205
- package/convex/telemetry.ts +0 -434
- package/convex/tokens.ts +0 -88
- package/convex/tsconfig.json +0 -7
- package/convex/uploads.ts +0 -20
- package/convex/users.ts +0 -122
- package/convex/webhooks.ts +0 -50
- package/convex.json +0 -3
- package/docs/README.md +0 -32
- package/docs/api.md +0 -51
- package/docs/architecture.md +0 -61
- package/docs/auth.md +0 -54
- package/docs/cli.md +0 -117
- package/docs/deploy.md +0 -78
- package/docs/diffing.md +0 -84
- package/docs/github-import.md +0 -171
- package/docs/http-api.md +0 -187
- package/docs/manual-testing.md +0 -64
- package/docs/mintlify.md +0 -43
- package/docs/quickstart.md +0 -120
- package/docs/skill-format.md +0 -58
- package/docs/soul-format.md +0 -37
- package/docs/spec.md +0 -177
- package/docs/telemetry.md +0 -91
- package/docs/troubleshooting.md +0 -49
- package/docs/webhook.md +0 -51
- package/e2e/menu-smoke.pw.test.ts +0 -49
- package/e2e/pilothub.e2e.test.ts +0 -494
- package/e2e/search-exact.pw.test.ts +0 -97
- package/packages/pilothub/LICENSE +0 -22
- package/packages/pilothub/README.md +0 -57
- package/packages/pilothub/package.json +0 -41
- package/packages/pilothub/src/browserAuth.test.ts +0 -96
- package/packages/pilothub/src/browserAuth.ts +0 -174
- package/packages/pilothub/src/cli/buildInfo.ts +0 -94
- package/packages/pilothub/src/cli/commands/auth.ts +0 -97
- package/packages/pilothub/src/cli/commands/delete.test.ts +0 -73
- package/packages/pilothub/src/cli/commands/delete.ts +0 -83
- package/packages/pilothub/src/cli/commands/publish.test.ts +0 -122
- package/packages/pilothub/src/cli/commands/publish.ts +0 -108
- package/packages/pilothub/src/cli/commands/skills.test.ts +0 -191
- package/packages/pilothub/src/cli/commands/skills.ts +0 -380
- package/packages/pilothub/src/cli/commands/star.ts +0 -46
- package/packages/pilothub/src/cli/commands/sync.test.ts +0 -310
- package/packages/pilothub/src/cli/commands/sync.ts +0 -200
- package/packages/pilothub/src/cli/commands/syncHelpers.test.ts +0 -26
- package/packages/pilothub/src/cli/commands/syncHelpers.ts +0 -427
- package/packages/pilothub/src/cli/commands/syncTypes.ts +0 -27
- package/packages/pilothub/src/cli/commands/unstar.ts +0 -48
- package/packages/pilothub/src/cli/helpStyle.ts +0 -45
- package/packages/pilothub/src/cli/pilotbotConfig.test.ts +0 -159
- package/packages/pilothub/src/cli/pilotbotConfig.ts +0 -147
- package/packages/pilothub/src/cli/registry.test.ts +0 -63
- package/packages/pilothub/src/cli/registry.ts +0 -43
- package/packages/pilothub/src/cli/scanSkills.test.ts +0 -64
- package/packages/pilothub/src/cli/scanSkills.ts +0 -84
- package/packages/pilothub/src/cli/slug.ts +0 -16
- package/packages/pilothub/src/cli/types.ts +0 -12
- package/packages/pilothub/src/cli/ui.ts +0 -75
- package/packages/pilothub/src/cli.ts +0 -311
- package/packages/pilothub/src/config.ts +0 -36
- package/packages/pilothub/src/discovery.test.ts +0 -75
- package/packages/pilothub/src/discovery.ts +0 -19
- package/packages/pilothub/src/http.test.ts +0 -156
- package/packages/pilothub/src/http.ts +0 -301
- package/packages/pilothub/src/schema/ark.ts +0 -29
- package/packages/pilothub/src/schema/index.ts +0 -5
- package/packages/pilothub/src/schema/routes.ts +0 -22
- package/packages/pilothub/src/schema/schemas.ts +0 -260
- package/packages/pilothub/src/schema/textFiles.test.ts +0 -23
- package/packages/pilothub/src/schema/textFiles.ts +0 -66
- package/packages/pilothub/src/skills.test.ts +0 -191
- package/packages/pilothub/src/skills.ts +0 -172
- package/packages/pilothub/src/types.ts +0 -10
- package/packages/pilothub/tsconfig.json +0 -14
- package/packages/schema/README.md +0 -3
- package/packages/schema/dist/ark.js.map +0 -1
- package/packages/schema/dist/index.js.map +0 -1
- package/packages/schema/dist/routes.js.map +0 -1
- package/packages/schema/dist/schemas.js.map +0 -1
- package/packages/schema/dist/textFiles.js.map +0 -1
- package/packages/schema/package.json +0 -26
- package/packages/schema/src/ark.ts +0 -29
- package/packages/schema/src/index.ts +0 -5
- package/packages/schema/src/routes.ts +0 -22
- package/packages/schema/src/schemas.test.ts +0 -123
- package/packages/schema/src/schemas.ts +0 -287
- package/packages/schema/src/textFiles.test.ts +0 -23
- package/packages/schema/src/textFiles.ts +0 -66
- package/packages/schema/tsconfig.json +0 -15
- package/pilothub +0 -46
- package/playwright.config.ts +0 -33
- package/public/.well-known/pilothub.json +0 -6
- package/public/api/v1/openapi.json +0 -379
- package/public/favicon.ico +0 -0
- package/public/logo192.png +0 -0
- package/public/logo512.png +0 -0
- package/public/manifest.json +0 -25
- package/public/og.png +0 -0
- package/public/og.svg +0 -98
- package/public/pilot-logo.png +0 -0
- package/public/pilot-mark.png +0 -0
- package/public/robots.txt +0 -3
- package/public/tanstack-circle-logo.png +0 -0
- package/public/tanstack-word-logo-white.svg +0 -1
- package/scripts/check-peer-deps.ts +0 -56
- package/scripts/docs-list.ts +0 -148
- package/scripts/run-playwright-local.sh +0 -14
- package/server/og/fetchSkillOgMeta.ts +0 -27
- package/server/og/fetchSoulOgMeta.ts +0 -27
- package/server/og/ogAssets.ts +0 -80
- package/server/og/skillOgSvg.test.ts +0 -59
- package/server/og/skillOgSvg.ts +0 -258
- package/server/og/soulOgSvg.ts +0 -209
- package/server/routes/og/skill.png.ts +0 -103
- package/server/routes/og/soul.png.ts +0 -111
- package/src/__tests__/skill-detail-page.test.tsx +0 -86
- package/src/__tests__/skills-index.test.tsx +0 -145
- package/src/__tests__/upload.route.test.tsx +0 -228
- package/src/components/AppProviders.tsx +0 -19
- package/src/components/ClientOnly.tsx +0 -18
- package/src/components/Footer.tsx +0 -29
- package/src/components/Header.tsx +0 -295
- package/src/components/InstallSwitcher.tsx +0 -53
- package/src/components/SkillCard.tsx +0 -36
- package/src/components/SkillDetailPage.tsx +0 -817
- package/src/components/SkillDiffCard.tsx +0 -485
- package/src/components/SoulCard.tsx +0 -19
- package/src/components/SoulDetailPage.tsx +0 -263
- package/src/components/UserBootstrap.tsx +0 -18
- package/src/components/ui/dropdown-menu.tsx +0 -67
- package/src/components/ui/toggle-group.tsx +0 -35
- package/src/convex/client.ts +0 -3
- package/src/lib/badges.ts +0 -29
- package/src/lib/diffing.test.ts +0 -163
- package/src/lib/diffing.ts +0 -106
- package/src/lib/gravatar.test.ts +0 -9
- package/src/lib/gravatar.ts +0 -158
- package/src/lib/og.test.ts +0 -142
- package/src/lib/og.ts +0 -156
- package/src/lib/publicUser.ts +0 -39
- package/src/lib/roles.ts +0 -19
- package/src/lib/site.test.ts +0 -130
- package/src/lib/site.ts +0 -84
- package/src/lib/theme-transition.test.ts +0 -134
- package/src/lib/theme-transition.ts +0 -134
- package/src/lib/theme.test.tsx +0 -88
- package/src/lib/theme.ts +0 -43
- package/src/lib/uploadFiles.jsdom.test.ts +0 -33
- package/src/lib/uploadFiles.test.ts +0 -123
- package/src/lib/uploadFiles.ts +0 -245
- package/src/lib/uploadUtils.test.ts +0 -78
- package/src/lib/uploadUtils.ts +0 -93
- package/src/lib/useAuthStatus.ts +0 -12
- package/src/lib/utils.test.ts +0 -9
- package/src/lib/utils.ts +0 -6
- package/src/logo.svg +0 -12
- package/src/routeTree.gen.ts +0 -345
- package/src/router.tsx +0 -17
- package/src/routes/$owner/$slug.tsx +0 -55
- package/src/routes/__root.tsx +0 -136
- package/src/routes/admin.tsx +0 -11
- package/src/routes/cli/auth.tsx +0 -168
- package/src/routes/dashboard.tsx +0 -97
- package/src/routes/import.tsx +0 -415
- package/src/routes/index.tsx +0 -252
- package/src/routes/management.tsx +0 -529
- package/src/routes/settings.tsx +0 -203
- package/src/routes/skills/index.tsx +0 -422
- package/src/routes/souls/$slug.tsx +0 -55
- package/src/routes/souls/index.tsx +0 -243
- package/src/routes/stars.tsx +0 -68
- package/src/routes/u/$handle.tsx +0 -307
- package/src/routes/upload/utils.ts +0 -81
- package/src/routes/upload.tsx +0 -499
- package/src/styles.css +0 -2718
- package/tsconfig.json +0 -24
- package/tsconfig.oxlint.json +0 -16
- package/vercel.json +0 -8
- package/vite.config.ts +0 -48
- package/vitest.config.ts +0 -47
- package/vitest.e2e.config.ts +0 -11
- package/vitest.setup.ts +0 -1
- /package/{packages/pilothub/bin → bin}/pilothub.js +0 -0
- /package/{packages/schema/dist → dist/schema}/ark.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/ark.js +0 -0
- /package/{packages/schema/dist → dist/schema}/index.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/index.js +0 -0
- /package/{packages/schema/dist → dist/schema}/routes.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/routes.js +0 -0
- /package/{packages/schema/dist → dist/schema}/textFiles.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/textFiles.js +0 -0
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,150 +1,57 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `pilothub`
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
<a href="https://github.com/pilotbot/pilothub/actions/workflows/ci.yml?branch=main"><img src="https://img.shields.io/github/actions/workflow/status/pilotbot/pilothub/ci.yml?branch=main&style=for-the-badge" alt="CI status"></a>
|
|
5
|
-
<a href="https://discord.gg/pilot"><img src="https://img.shields.io/discord/1456350064065904867?label=Discord&logo=discord&logoColor=white&color=5865F2&style=for-the-badge" alt="Discord"></a>
|
|
6
|
-
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge" alt="MIT License"></a>
|
|
7
|
-
</p>
|
|
3
|
+
PilotHub CLI — install, update, search, and publish agent skills as folders.
|
|
8
4
|
|
|
9
|
-
|
|
10
|
-
It’s designed for fast browsing + a CLI-friendly API, with moderation hooks and vector search.
|
|
11
|
-
|
|
12
|
-
onlycrabs.ai is the **SOUL.md registry**: publish and share system lore the same way you publish skills.
|
|
13
|
-
|
|
14
|
-
Live: `https://pilothub.com`
|
|
15
|
-
onlycrabs.ai: `https://onlycrabs.ai`
|
|
16
|
-
|
|
17
|
-
## What you can do
|
|
18
|
-
|
|
19
|
-
- Browse skills + render their `SKILL.md`.
|
|
20
|
-
- Publish new skill versions with changelogs + tags (including `latest`).
|
|
21
|
-
- Browse souls + render their `SOUL.md`.
|
|
22
|
-
- Publish new soul versions with changelogs + tags.
|
|
23
|
-
- Search via embeddings (vector index) instead of brittle keywords.
|
|
24
|
-
- Star + comment; admins/mods can curate and approve skills.
|
|
25
|
-
|
|
26
|
-
## onlycrabs.ai (SOUL.md registry)
|
|
27
|
-
|
|
28
|
-
- Entry point is host-based: `onlycrabs.ai`.
|
|
29
|
-
- On the onlycrabs.ai host, the home page and nav default to souls.
|
|
30
|
-
- On PilotHub, souls live under `/souls`.
|
|
31
|
-
- Soul bundles only accept `SOUL.md` for now (no extra files).
|
|
32
|
-
|
|
33
|
-
## How it works (high level)
|
|
34
|
-
|
|
35
|
-
- Web app: TanStack Start (React, Vite/Nitro).
|
|
36
|
-
- Backend: Convex (DB + file storage + HTTP actions) + Convex Auth (GitHub OAuth).
|
|
37
|
-
- Search: OpenAI embeddings (`text-embedding-3-small`) + Convex vector search.
|
|
38
|
-
- API schema + routes: `packages/schema` (`pilothub-schema`).
|
|
39
|
-
|
|
40
|
-
## Telemetry
|
|
41
|
-
|
|
42
|
-
PilotHub tracks minimal **install telemetry** (to compute install counts) when you run `pilothub sync` while logged in.
|
|
43
|
-
Disable via:
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
export PILOTHUB_DISABLE_TELEMETRY=1
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
Details: `docs/telemetry.md`.
|
|
50
|
-
|
|
51
|
-
## Repo layout
|
|
52
|
-
|
|
53
|
-
- `src/` — TanStack Start app (routes, components, styles).
|
|
54
|
-
- `convex/` — schema + queries/mutations/actions + HTTP API routes.
|
|
55
|
-
- `packages/schema/` — shared API types/routes for the CLI and app.
|
|
56
|
-
- `docs/spec.md` — product + implementation spec (good first read).
|
|
57
|
-
|
|
58
|
-
## Local dev
|
|
59
|
-
|
|
60
|
-
Prereqs: Bun + Convex CLI.
|
|
5
|
+
## Install
|
|
61
6
|
|
|
62
7
|
```bash
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
# terminal A: web app
|
|
67
|
-
bun run dev
|
|
8
|
+
# From this repo (shortcut script at repo root)
|
|
9
|
+
bun pilothub --help
|
|
68
10
|
|
|
69
|
-
#
|
|
70
|
-
|
|
11
|
+
# Once published to npm
|
|
12
|
+
# npm i -g pilothub
|
|
71
13
|
```
|
|
72
14
|
|
|
73
|
-
## Auth (
|
|
74
|
-
|
|
75
|
-
Create a GitHub OAuth App, set `AUTH_GITHUB_ID` / `AUTH_GITHUB_SECRET`, then:
|
|
15
|
+
## Auth (publish)
|
|
76
16
|
|
|
77
17
|
```bash
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
This writes `JWT_PRIVATE_KEY` + `JWKS` to the deployment and prints values for your local `.env.local`.
|
|
82
|
-
|
|
83
|
-
## Environment
|
|
84
|
-
|
|
85
|
-
- `VITE_CONVEX_URL`: Convex deployment URL (`https://<deployment>.convex.cloud`).
|
|
86
|
-
- `VITE_CONVEX_SITE_URL`: Convex site URL (`https://<deployment>.convex.site`).
|
|
87
|
-
- `VITE_SOULHUB_SITE_URL`: onlycrabs.ai site URL (`https://onlycrabs.ai`).
|
|
88
|
-
- `VITE_SOULHUB_HOST`: onlycrabs.ai host match (`onlycrabs.ai`).
|
|
89
|
-
- `VITE_SITE_MODE`: Optional override (`skills` or `souls`) for SSR builds.
|
|
90
|
-
- `CONVEX_SITE_URL`: same as `VITE_CONVEX_SITE_URL` (auth + cookies).
|
|
91
|
-
- `SITE_URL`: App URL (local: `http://localhost:3000`).
|
|
92
|
-
- `AUTH_GITHUB_ID` / `AUTH_GITHUB_SECRET`: GitHub OAuth App.
|
|
93
|
-
- `JWT_PRIVATE_KEY` / `JWKS`: Convex Auth keys.
|
|
94
|
-
- `OPENAI_API_KEY`: embeddings for search + indexing.
|
|
95
|
-
|
|
96
|
-
## Nix plugins (nixmode skills)
|
|
97
|
-
|
|
98
|
-
PilotHub can store a nix-pilotbot plugin pointer in SKILL frontmatter so the registry knows which
|
|
99
|
-
Nix package bundle to install. A nix plugin is different from a regular skill pack: it bundles the
|
|
100
|
-
skill pack, the CLI binary, and its config flags/requirements together.
|
|
18
|
+
pilothub login
|
|
19
|
+
# or
|
|
20
|
+
pilothub auth login
|
|
101
21
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
name: peekaboo
|
|
107
|
-
description: Capture and automate macOS UI with the Peekaboo CLI.
|
|
108
|
-
metadata: {"pilotbot":{"nix":{"plugin":"github:pilotbot/nix-steipete-tools?dir=tools/peekaboo","systems":["aarch64-darwin"]}}}
|
|
109
|
-
---
|
|
22
|
+
# Headless / token paste
|
|
23
|
+
# or (token paste / headless)
|
|
24
|
+
pilothub login --token clh_...
|
|
110
25
|
```
|
|
111
26
|
|
|
112
|
-
|
|
27
|
+
Notes:
|
|
113
28
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
{ source = "github:pilotbot/nix-steipete-tools?dir=tools/peekaboo"; }
|
|
117
|
-
];
|
|
118
|
-
```
|
|
29
|
+
- Browser login opens `https://pilothub.com/cli/auth` and completes via a loopback callback.
|
|
30
|
+
- Token stored in `~/Library/Application Support/pilothub/config.json` on macOS (override via `PILOTHUB_CONFIG_PATH`).
|
|
119
31
|
|
|
120
|
-
|
|
32
|
+
## Examples
|
|
121
33
|
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
34
|
+
```bash
|
|
35
|
+
pilothub search "postgres backups"
|
|
36
|
+
pilothub install my-skill-pack
|
|
37
|
+
pilothub update --all
|
|
38
|
+
pilothub update --all --no-input --force
|
|
39
|
+
pilothub publish ./my-skill-pack --slug my-skill-pack --name "My Skill Pack" --version 1.2.0 --changelog "Fixes + docs"
|
|
128
40
|
```
|
|
129
41
|
|
|
130
|
-
|
|
42
|
+
## Sync (upload local skills)
|
|
131
43
|
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
description: Check padel court availability and manage bookings via Playtomic.
|
|
136
|
-
metadata: {"pilotbot":{"cliHelp":"padel --help\\nUsage: padel [command]\\n"}}
|
|
137
|
-
---
|
|
138
|
-
```
|
|
44
|
+
```bash
|
|
45
|
+
# Start anywhere; scans workdir first, then legacy Pilotbot/Pilot locations.
|
|
46
|
+
pilothub sync
|
|
139
47
|
|
|
140
|
-
|
|
48
|
+
# Explicit roots + non-interactive dry-run
|
|
49
|
+
pilothub sync --root ../pilotbot/skills --all --dry-run
|
|
50
|
+
```
|
|
141
51
|
|
|
142
|
-
##
|
|
52
|
+
## Defaults
|
|
143
53
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
bun run coverage
|
|
149
|
-
bun run lint
|
|
150
|
-
```
|
|
54
|
+
- Site: `https://pilothub.com` (override via `--site` or `PILOTHUB_SITE`)
|
|
55
|
+
- Registry: discovered from `/.well-known/pilothub.json` on the site (override via `--registry` or `PILOTHUB_REGISTRY`)
|
|
56
|
+
- Workdir: current directory (falls back to Pilotbot workspace if configured; override via `--workdir` or `PILOTHUB_WORKDIR`)
|
|
57
|
+
- Install dir: `./skills` under workdir (override via `--dir`)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type LoopbackAuthResult = {
|
|
2
|
+
token: string;
|
|
3
|
+
registry?: string;
|
|
4
|
+
state?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function buildCliAuthUrl(params: {
|
|
7
|
+
siteUrl: string;
|
|
8
|
+
redirectUri: string;
|
|
9
|
+
label?: string;
|
|
10
|
+
state: string;
|
|
11
|
+
}): string;
|
|
12
|
+
export declare function isAllowedLoopbackRedirectUri(value: string): boolean;
|
|
13
|
+
export declare function startLoopbackAuthServer(params?: {
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
redirectUri: string;
|
|
17
|
+
state: string;
|
|
18
|
+
waitForResult: () => Promise<LoopbackAuthResult>;
|
|
19
|
+
close: () => import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
|
|
20
|
+
}>;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
export function buildCliAuthUrl(params) {
|
|
3
|
+
const url = new URL('/cli/auth', params.siteUrl);
|
|
4
|
+
url.searchParams.set('redirect_uri', params.redirectUri);
|
|
5
|
+
if (params.label)
|
|
6
|
+
url.searchParams.set('label_b64', encodeBase64Url(params.label));
|
|
7
|
+
url.searchParams.set('state', params.state);
|
|
8
|
+
return url.toString();
|
|
9
|
+
}
|
|
10
|
+
export function isAllowedLoopbackRedirectUri(value) {
|
|
11
|
+
let url;
|
|
12
|
+
try {
|
|
13
|
+
url = new URL(value);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (url.protocol !== 'http:')
|
|
19
|
+
return false;
|
|
20
|
+
const host = url.hostname.toLowerCase();
|
|
21
|
+
if (host !== '127.0.0.1' && host !== 'localhost' && host !== '::1' && host !== '[::1]') {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
export async function startLoopbackAuthServer(params) {
|
|
27
|
+
const timeoutMs = params?.timeoutMs ?? 5 * 60_000;
|
|
28
|
+
const expectedState = generateState();
|
|
29
|
+
let resolveToken = null;
|
|
30
|
+
let rejectToken = null;
|
|
31
|
+
const tokenPromise = new Promise((resolve, reject) => {
|
|
32
|
+
resolveToken = resolve;
|
|
33
|
+
rejectToken = reject;
|
|
34
|
+
});
|
|
35
|
+
const server = createServer((req, res) => {
|
|
36
|
+
const method = req.method ?? 'GET';
|
|
37
|
+
const url = req.url ?? '/';
|
|
38
|
+
if (method === 'GET' && (url === '/' || url.startsWith('/callback'))) {
|
|
39
|
+
res.statusCode = 200;
|
|
40
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
41
|
+
res.end(CALLBACK_HTML);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (method === 'POST' && url === '/token') {
|
|
45
|
+
const chunks = [];
|
|
46
|
+
req.on('data', (chunk) => chunks.push(chunk));
|
|
47
|
+
req.on('end', () => {
|
|
48
|
+
try {
|
|
49
|
+
const raw = Buffer.concat(chunks).toString('utf8');
|
|
50
|
+
const parsed = JSON.parse(raw);
|
|
51
|
+
if (!parsed || typeof parsed !== 'object')
|
|
52
|
+
throw new Error('invalid payload');
|
|
53
|
+
const token = parsed.token;
|
|
54
|
+
const registry = parsed.registry;
|
|
55
|
+
const state = parsed.state;
|
|
56
|
+
if (typeof token !== 'string' || !token.trim())
|
|
57
|
+
throw new Error('token required');
|
|
58
|
+
if (typeof state !== 'string' || state !== expectedState) {
|
|
59
|
+
throw new Error('state mismatch');
|
|
60
|
+
}
|
|
61
|
+
res.statusCode = 200;
|
|
62
|
+
res.setHeader('Content-Type', 'application/json');
|
|
63
|
+
res.end(JSON.stringify({ ok: true }));
|
|
64
|
+
resolveToken?.({
|
|
65
|
+
token: token.trim(),
|
|
66
|
+
registry: typeof registry === 'string' ? registry : undefined,
|
|
67
|
+
state,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
res.statusCode = 400;
|
|
72
|
+
res.setHeader('Content-Type', 'application/json');
|
|
73
|
+
res.end(JSON.stringify({ ok: false }));
|
|
74
|
+
const message = error instanceof Error ? error.message : 'invalid payload';
|
|
75
|
+
rejectToken?.(new Error(message));
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
server.close();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
res.statusCode = 404;
|
|
84
|
+
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
|
|
85
|
+
res.end('Not found');
|
|
86
|
+
});
|
|
87
|
+
await new Promise((resolve, reject) => {
|
|
88
|
+
server.once('error', reject);
|
|
89
|
+
server.listen(0, '127.0.0.1', () => resolve());
|
|
90
|
+
});
|
|
91
|
+
const address = server.address();
|
|
92
|
+
if (!address) {
|
|
93
|
+
server.close();
|
|
94
|
+
throw new Error('Failed to bind loopback server');
|
|
95
|
+
}
|
|
96
|
+
const redirectUri = `http://127.0.0.1:${address.port}/callback`;
|
|
97
|
+
const timeout = setTimeout(() => {
|
|
98
|
+
server.close();
|
|
99
|
+
rejectToken?.(new Error('Timed out waiting for browser login'));
|
|
100
|
+
}, timeoutMs);
|
|
101
|
+
tokenPromise.finally(() => clearTimeout(timeout)).catch(() => { });
|
|
102
|
+
return {
|
|
103
|
+
redirectUri,
|
|
104
|
+
state: expectedState,
|
|
105
|
+
waitForResult: () => tokenPromise,
|
|
106
|
+
close: () => server.close(),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const CALLBACK_HTML = `<!doctype html>
|
|
110
|
+
<html lang="en">
|
|
111
|
+
<meta charset="utf-8" />
|
|
112
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
113
|
+
<title>PilotHub CLI Login</title>
|
|
114
|
+
<style>
|
|
115
|
+
:root { color-scheme: light dark; }
|
|
116
|
+
body { font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif; padding: 24px; }
|
|
117
|
+
.card { max-width: 560px; margin: 40px auto; padding: 18px 16px; border: 1px solid rgba(127,127,127,.35); border-radius: 12px; }
|
|
118
|
+
code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
|
|
119
|
+
</style>
|
|
120
|
+
<body>
|
|
121
|
+
<div class="card">
|
|
122
|
+
<h1 style="margin: 0 0 10px; font-size: 18px;">Completing login…</h1>
|
|
123
|
+
<p id="status" style="margin: 0; opacity: .8;">Waiting for token.</p>
|
|
124
|
+
</div>
|
|
125
|
+
<script>
|
|
126
|
+
const statusEl = document.getElementById('status')
|
|
127
|
+
const params = new URLSearchParams(location.hash.replace(/^#/, ''))
|
|
128
|
+
const token = params.get('token')
|
|
129
|
+
const registry = params.get('registry')
|
|
130
|
+
const state = params.get('state')
|
|
131
|
+
if (!token) {
|
|
132
|
+
statusEl.textContent = 'Missing token in URL. You can close this tab and try again.'
|
|
133
|
+
} else if (!state) {
|
|
134
|
+
statusEl.textContent = 'Missing state in URL. You can close this tab and try again.'
|
|
135
|
+
} else {
|
|
136
|
+
fetch('/token', {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
headers: { 'Content-Type': 'application/json' },
|
|
139
|
+
body: JSON.stringify({ token, registry, state }),
|
|
140
|
+
}).then(() => {
|
|
141
|
+
statusEl.textContent = 'Logged in. You can close this tab.'
|
|
142
|
+
setTimeout(() => window.close(), 250)
|
|
143
|
+
}).catch(() => {
|
|
144
|
+
statusEl.textContent = 'Failed to send token to CLI. You can close this tab and try again.'
|
|
145
|
+
})
|
|
146
|
+
}
|
|
147
|
+
</script>
|
|
148
|
+
</body>
|
|
149
|
+
</html>`;
|
|
150
|
+
function encodeBase64Url(value) {
|
|
151
|
+
return Buffer.from(value, 'utf8').toString('base64url');
|
|
152
|
+
}
|
|
153
|
+
function generateState() {
|
|
154
|
+
return Buffer.from(crypto.getRandomValues(new Uint8Array(16))).toString('hex');
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=browserAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserAuth.js","sourceRoot":"","sources":["../src/browserAuth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/* @vitest-environment node */
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { buildCliAuthUrl, isAllowedLoopbackRedirectUri, startLoopbackAuthServer, } from './browserAuth';
|
|
4
|
+
describe('browserAuth', () => {
|
|
5
|
+
it('builds auth url', () => {
|
|
6
|
+
const url = buildCliAuthUrl({
|
|
7
|
+
siteUrl: 'https://example.com',
|
|
8
|
+
redirectUri: 'http://127.0.0.1:1234/callback',
|
|
9
|
+
label: 'CLI token',
|
|
10
|
+
state: 'state123',
|
|
11
|
+
});
|
|
12
|
+
expect(url).toContain('https://example.com/cli/auth?');
|
|
13
|
+
expect(url).toContain('redirect_uri=');
|
|
14
|
+
expect(url).toContain('label_b64=');
|
|
15
|
+
expect(url).toContain('state=');
|
|
16
|
+
});
|
|
17
|
+
it('builds auth url without label', () => {
|
|
18
|
+
const url = buildCliAuthUrl({
|
|
19
|
+
siteUrl: 'https://example.com',
|
|
20
|
+
redirectUri: 'http://127.0.0.1:1234/callback',
|
|
21
|
+
state: 'state123',
|
|
22
|
+
});
|
|
23
|
+
expect(url).toContain('https://example.com/cli/auth?');
|
|
24
|
+
expect(url).not.toContain('label_b64=');
|
|
25
|
+
});
|
|
26
|
+
it('accepts only loopback http redirect uris', () => {
|
|
27
|
+
expect(isAllowedLoopbackRedirectUri('http://127.0.0.1:1234/callback')).toBe(true);
|
|
28
|
+
expect(isAllowedLoopbackRedirectUri('http://localhost:1234/callback')).toBe(true);
|
|
29
|
+
expect(isAllowedLoopbackRedirectUri('http://[::1]:1234/callback')).toBe(true);
|
|
30
|
+
expect(isAllowedLoopbackRedirectUri('https://127.0.0.1:1234/callback')).toBe(false);
|
|
31
|
+
expect(isAllowedLoopbackRedirectUri('http://evil.com/callback')).toBe(false);
|
|
32
|
+
expect(isAllowedLoopbackRedirectUri('not a url')).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
it('receives token via loopback server', async () => {
|
|
35
|
+
const server = await startLoopbackAuthServer({ timeoutMs: 2000 });
|
|
36
|
+
const payload = {
|
|
37
|
+
token: 'clh_test',
|
|
38
|
+
registry: 'https://example.convex.site',
|
|
39
|
+
state: server.state,
|
|
40
|
+
};
|
|
41
|
+
await fetch(server.redirectUri.replace('/callback', '/token'), {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
headers: { 'Content-Type': 'application/json' },
|
|
44
|
+
body: JSON.stringify(payload),
|
|
45
|
+
});
|
|
46
|
+
await expect(server.waitForResult()).resolves.toEqual(payload);
|
|
47
|
+
});
|
|
48
|
+
it('serves callback html', async () => {
|
|
49
|
+
const server = await startLoopbackAuthServer({ timeoutMs: 2000 });
|
|
50
|
+
const response = await fetch(server.redirectUri);
|
|
51
|
+
expect(response.status).toBe(200);
|
|
52
|
+
const text = await response.text();
|
|
53
|
+
expect(text).toContain('PilotHub CLI Login');
|
|
54
|
+
server.close();
|
|
55
|
+
});
|
|
56
|
+
it('returns 404 for unknown routes', async () => {
|
|
57
|
+
const server = await startLoopbackAuthServer({ timeoutMs: 2000 });
|
|
58
|
+
const response = await fetch(server.redirectUri.replace('/callback', '/nope'));
|
|
59
|
+
expect(response.status).toBe(404);
|
|
60
|
+
server.close();
|
|
61
|
+
});
|
|
62
|
+
it('rejects invalid json payloads', async () => {
|
|
63
|
+
const server = await startLoopbackAuthServer({ timeoutMs: 2000 });
|
|
64
|
+
const tokenUrl = server.redirectUri.replace('/callback', '/token');
|
|
65
|
+
const response = await fetch(tokenUrl, { method: 'POST', body: '{' });
|
|
66
|
+
expect(response.status).toBe(400);
|
|
67
|
+
await expect(server.waitForResult()).rejects.toThrow();
|
|
68
|
+
});
|
|
69
|
+
it('rejects state mismatches', async () => {
|
|
70
|
+
const server = await startLoopbackAuthServer({ timeoutMs: 2000 });
|
|
71
|
+
await fetch(server.redirectUri.replace('/callback', '/token'), {
|
|
72
|
+
method: 'POST',
|
|
73
|
+
headers: { 'Content-Type': 'application/json' },
|
|
74
|
+
body: JSON.stringify({ token: 'clh_test', registry: 'https://example.com', state: 'nope' }),
|
|
75
|
+
});
|
|
76
|
+
await expect(server.waitForResult()).rejects.toThrow(/state mismatch/i);
|
|
77
|
+
});
|
|
78
|
+
it('times out waiting for login', async () => {
|
|
79
|
+
const server = await startLoopbackAuthServer({ timeoutMs: 25 });
|
|
80
|
+
await expect(server.waitForResult()).rejects.toThrow(/timed out waiting for browser login/i);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=browserAuth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserAuth.test.js","sourceRoot":"","sources":["../src/browserAuth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
function readPackageVersion() {
|
|
5
|
+
try {
|
|
6
|
+
const path = join(dirname(fileURLToPath(import.meta.url)), '../../package.json');
|
|
7
|
+
const raw = readFileSync(path, 'utf8');
|
|
8
|
+
const pkg = JSON.parse(raw);
|
|
9
|
+
return typeof pkg.version === 'string' ? pkg.version : '0.0.0';
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return '0.0.0';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function shortCommit(value) {
|
|
16
|
+
const trimmed = value.trim();
|
|
17
|
+
if (!trimmed)
|
|
18
|
+
return null;
|
|
19
|
+
if (trimmed.length <= 8)
|
|
20
|
+
return trimmed;
|
|
21
|
+
return trimmed.slice(0, 8);
|
|
22
|
+
}
|
|
23
|
+
export function getCliCommit() {
|
|
24
|
+
const candidates = [
|
|
25
|
+
process.env.PILOTHUB_COMMIT,
|
|
26
|
+
process.env.VERCEL_GIT_COMMIT_SHA,
|
|
27
|
+
process.env.GITHUB_SHA,
|
|
28
|
+
process.env.COMMIT_SHA,
|
|
29
|
+
];
|
|
30
|
+
for (const candidate of candidates) {
|
|
31
|
+
if (!candidate)
|
|
32
|
+
continue;
|
|
33
|
+
const short = shortCommit(candidate);
|
|
34
|
+
if (short)
|
|
35
|
+
return short;
|
|
36
|
+
}
|
|
37
|
+
return readGitCommitFromCwd();
|
|
38
|
+
}
|
|
39
|
+
export function getCliVersion() {
|
|
40
|
+
return readPackageVersion();
|
|
41
|
+
}
|
|
42
|
+
export function getCliBuildLabel() {
|
|
43
|
+
const version = getCliVersion();
|
|
44
|
+
const commit = getCliCommit();
|
|
45
|
+
return commit ? `v${version} (${commit})` : `v${version}`;
|
|
46
|
+
}
|
|
47
|
+
function readGitCommitFromCwd() {
|
|
48
|
+
try {
|
|
49
|
+
const gitDir = findGitDir(process.cwd());
|
|
50
|
+
if (!gitDir)
|
|
51
|
+
return null;
|
|
52
|
+
const headPath = join(gitDir, 'HEAD');
|
|
53
|
+
if (!existsSync(headPath))
|
|
54
|
+
return null;
|
|
55
|
+
const head = readFileSync(headPath, 'utf8').trim();
|
|
56
|
+
if (!head)
|
|
57
|
+
return null;
|
|
58
|
+
if (!head.startsWith('ref:'))
|
|
59
|
+
return shortCommit(head);
|
|
60
|
+
const ref = head.replace(/^ref:\s*/, '').trim();
|
|
61
|
+
if (!ref)
|
|
62
|
+
return null;
|
|
63
|
+
const refPath = join(gitDir, ref);
|
|
64
|
+
if (!existsSync(refPath))
|
|
65
|
+
return null;
|
|
66
|
+
const sha = readFileSync(refPath, 'utf8').trim();
|
|
67
|
+
return shortCommit(sha);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function findGitDir(start) {
|
|
74
|
+
let current = resolve(start);
|
|
75
|
+
for (;;) {
|
|
76
|
+
const dotGit = join(current, '.git');
|
|
77
|
+
if (existsSync(dotGit)) {
|
|
78
|
+
try {
|
|
79
|
+
const stat = statSync(dotGit);
|
|
80
|
+
if (stat.isDirectory())
|
|
81
|
+
return dotGit;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// ignore
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const content = readFileSync(dotGit, 'utf8').trim();
|
|
88
|
+
const match = content.match(/^gitdir:\s*(.+)$/);
|
|
89
|
+
if (match?.[1])
|
|
90
|
+
return resolve(current, match[1]);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return dotGit;
|
|
94
|
+
}
|
|
95
|
+
return dotGit;
|
|
96
|
+
}
|
|
97
|
+
const parent = resolve(current, '..');
|
|
98
|
+
if (parent === current)
|
|
99
|
+
return null;
|
|
100
|
+
current = parent;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=buildInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildInfo.js","sourceRoot":"","sources":["../../src/cli/buildInfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GlobalOpts } from '../types.js';
|
|
2
|
+
export declare function cmdLoginFlow(opts: GlobalOpts, options: {
|
|
3
|
+
token?: string;
|
|
4
|
+
label?: string;
|
|
5
|
+
browser?: boolean;
|
|
6
|
+
}, inputAllowed: boolean): Promise<void>;
|
|
7
|
+
export declare function cmdLogin(opts: GlobalOpts, tokenFlag: string | undefined, inputAllowed: boolean): Promise<void>;
|
|
8
|
+
export declare function cmdLogout(opts: GlobalOpts): Promise<void>;
|
|
9
|
+
export declare function cmdWhoami(opts: GlobalOpts): Promise<void>;
|